package cn.learn.datetimeUtil;

import lombok.experimental.UtilityClass;

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * @author huangyezhan
 * @version 1.0
 * @date 2021年08月14日11:53
 */
@UtilityClass
public class LocalDateTimeUtil {
    /**
     * 确定时区偏移量
     */
    private static final ZoneOffset ZONE_OFFSET = ZoneOffset.of("+8");

    /**
     * 默认指定的时间格式
     */
    private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";

    private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern(DEFAULT_FORMAT);

    /**
     * 获取指定时间的毫秒数
     *
     * @param dateTime 指定时间
     * @return 返回毫秒数
     */
    public long getMilliByTime(LocalDateTime dateTime) {
        return dateTime.toInstant(ZONE_OFFSET).toEpochMilli();
    }

    public long getMilliByTime(LocalDateTime dateTime, String offsetId) {
        return dateTime.toInstant(ZoneOffset.of(offsetId)).toEpochMilli();
    }

    /**
     * 获取指定默认时间格式
     *
     * @param dateTime 时间
     * @return 返回格式后的时间
     */
    public String local2String(LocalDateTime dateTime) {
        return DTF.format(dateTime);
    }

    public String local2String(LocalDateTime dateTime, String format) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
        return dtf.format(dateTime);
    }

    /**
     * 时间字符串 转 LocalDateTime
     *
     * @param datetime 时间
     * @return 返回时间
     */
    public LocalDateTime string2Local(String datetime) {
        // localDateTime 解析出来的时间如：2021-08-08T23:02:44
        if (datetime.indexOf("T") > 0) {
            return LocalDateTime.parse(datetime);
        }
        return LocalDateTime.parse(datetime, DTF);
    }

    public LocalDateTime string2Local(String datetime, String format) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.parse(datetime, dtf);
    }

    /**
     * 本地时区的偏移量
     */
    public ZoneOffset localZoneOffset() {
        // 获取本地区的 zoneId
        ZoneId         zoneId = ZoneId.systemDefault();
        OffsetDateTime odt    = OffsetDateTime.now(zoneId);
        return odt.getOffset();
    }

}
